home *** CD-ROM | disk | FTP | other *** search
/ Chip 1996 April / CHIP 1996 aprilis (CD06).zip / CHIP_CD06.ISO / hypertxt.arj / 9410 / 386_3.CD < prev    next >
Text File  |  1994-11-23  |  19KB  |  325 lines

  1.           @VVédett módú grafikai példaprogram@N
  2.  
  3.           @VModern idôk -- III.@N
  4.  
  5.           Sorozatunk  második  részében  a  386-os védett módjába való
  6.           belépés  és  az  az  alatti  programozás elméleti alapjaival
  7.           foglalkoztunk.
  8.  
  9.  
  10.  
  11.  
  12.           Ezúttal  a  gyakorlati  megvalósítást  tárgyaljuk egy, a VGA
  13.           memóriáját  lineárisan  címzô grafikus példaprogram kapcsán.
  14.           @KAz  assembly  forráslistát  -- annak hossza miatt -- itt nem@N
  15.           @Kközöljük,  az  érdeklôdôk szerkesztôségünkben  megkaphatják.@N
  16.           @KA  file 386_3.ARJ  néven a CT BBS-en is megtalálható. (Tel.:@N
  17.           @K140-9312, minden este 6-tól reggel 9 óráig.)@N
  18.  
  19.  
  20.              @VA 80386 védett módjának használata nagyvonalakban@N
  21.  
  22.           A   80386   processzor   védett  módban  való  használatához
  23.           elengedhetetlenül    szükséges    a   CPU   által   használt
  24.           vezérlôregiszterek  és memóriatáblázatok elôzetes feltöltése
  25.           és  a  hardver  megfelelô  átállítása.  E  tevékenységet  és
  26.           néhány   biztonsági  ellenôrzést  a  szakirodalomban  System
  27.           Builder  néven  említett  programrész  végzi  el,  a program
  28.           memóriában      elfoglalt      helyzetének     függvényében.
  29.           Feladatainak   végeztével  a  processzor  CR0  regiszterének
  30.           beállításával  a  processzort  védett módba lépteti, majd --
  31.           távoli   ugrással   törölve   a  CPU  elôolvasási  tárát  --
  32.           elindítja a System Kernel nevû felügyelô programot.
  33.  
  34.           A  Kernel  felel  a  teljes,  védett  módban  futó  rendszer
  35.           mûködéséért.   Feladata  a  taszkok  (egyes  feladatok  vagy
  36.           alprogramok)  indítása,  a  processzoridô  és az erôforrások
  37.           helyes  megosztása,  az  esetlegesen fellépô hibák kezelése,
  38.           valamint  a  virtuális  memória lapozása. A Kernel feladatai
  39.           közé  tartozik  a  védett  módú futás alatt fellépô DOS vagy
  40.           BIOS  I/O  igény  valós módú visszalépésekkel vagy V86 taszk
  41.           nyitásával  való teljesítése. Ha a rendszerbôl való végleges
  42.           kilépésre  van  szükség, a Kernel zárja le a futó taszkokat,
  43.           törli  a  virtuális  memória  lemezen  elhelyezkedô részeit,
  44.           valamint  visszaállítja  a  szegmensek  és  a  CR0 regiszter
  45.           valós módban használatos értékeit.
  46.  
  47.           E  rövid  áttekintô  ismertetés  után  lássuk részletesen az
  48.           egyes  lépéseket.  A  példaprogram természetesen változtatás
  49.           nélkül  futtatható  az  összes,  IBM  AT  386  számítógéppel
  50.           védett  módban  is teljesen kompatibilis rendszerben, de nem
  51.           futtatható  olyan  memóriakezelô  program felügyelete alatt,
  52.           amely  már  korábban védett módba kapcsolt (például: EMM386,
  53.           QEMM,  NetRoom),  s  nem  futtatható  a  Windows felügyelete
  54.           alatt   sem.   E   cikksorozat  és  a  szöveglistákban  lévô
  55.           megjegyzések  alapján bárki, aki érdeklôdik a 80386 assembly
  56.           nyelven  való  védett  módú programozása után, megértheti az
  57.           ehhez szükséges legelemibb ismereteket.
  58.  
  59.           Mûködô  példaprogram híján kénytelen voltam az eredeti Intel
  60.           processzorleírás    használatával   --   és   némi   hardver
  61.           ismerettel   --  magamtól  kiszenvedni  egyet.  (Az  általam
  62.           ismert  szakirodalom  nem  foglalkozott  386-os  AT  alaplap
  63.           átprogramozásával,    csak   a   processzor   védett   módba
  64.           léptetésével.)  Nem  hiszem,  hogy egyedül fel lehet venni a
  65.           versenyt  a  nagy  védett  módú  operációs  rendszerekkel és
  66.           memóriamenedzser  programokkal,  de  úgy  gondolom,  hogy  a
  67.           védett  módú programozás ismerete elôsegíti az egyre jobb --
  68.           kompatibilitást  nem  igénylô -- képfeldolgozó, zenei, játék
  69.           és demó programok fejlesztését.
  70.  
  71.  
  72.                              @VA System Builder@N
  73.  
  74.           Rövid  bejelentkezô  felirat kiíratása után a System Builder
  75.           ellenôrzi  a  szabad DOS memória méretét, valamint azt, hogy
  76.           V86  taszkban,  egy már futó System Kernel felügyelete alatt
  77.           fut-e.  Már  futó védelmi rendszer esetén a 0. védelmi szint
  78.           elérése,  és  a  rendszer felépítése nem lehetséges, minden,
  79.           rendszerregiszterbe   való  írási  kísérlet  kizárást  hozna
  80.           létre.  V86  taszk esetén az új System Builder hibaüzenettel
  81.           kilép.  Az  ellenôrzést  a  CR0 0. bitjének (PE = Protection
  82.           Enable)  tesztelésével  végzi  el,  amelynek 1 értéke jelzi,
  83.           hogy a processzor már védett módban van.
  84.  
  85.           Mivel   a   kontroll   regisztereknek  (CRx)  és  az  EFlags
  86.           regiszternek    nagy   jelentôsége   van   a   védett   módú
  87.           programozásban,   részletesen   elmagyarázom   felépítésüket
  88.           (lásd  a  ""CRx  és  EFLAGS" ábrát). A fenntartott és üresen
  89.           hagyott  biteket  nullára  kell  állítani  a  késôbbi  Intel
  90.           processzorokkal  való  kompatibilitás  miatt. Léteznek még a
  91.           tesztelést    (TRx)    és   nyomkövetést   (DRx)   elôsegítô
  92.           vezérlôregiszterek  is,  de  ezek használata nem feltétlenül
  93.           szükséges  egy  védett  módú rendszer futásához, inkább csak
  94.           diagnosztikai  és  debugger  programok  írásához. Bitenkénti
  95.           felosztásukat   késôbbi   cikkemben   fogom  megadni.  80386
  96.           processzorra  írt  programokban nem javasolt a CR1 regiszter
  97.           bárminemû felhasználása.
  98.  
  99.           Ha  a processzor még valós módban leledzik, a System Builder
  100.           feladata   a   védett   módú   futás   elôkészítése.   Külön
  101.           szegmenseken,  16-tal  osztható címekre elhelyezi a globális
  102.           és  interruptleíró táblázatokat, melyekben az 1 Mbyte alatti
  103.           lineáris   címek   kitöltését  a  program  aktuális  címének
  104.           megfelelôen,  futásidôben  kell  elvégezni. Ezután megkeresi
  105.           az  elsô,  4096-tal  osztható  szabad  címet  (laphatárt)  a
  106.           memóriában,  ahol  felépíti  a  lapkönyvtárat  és az elsô öt
  107.           laptáblát,  ami  20  Mbyte  lapszervezésû  virtuális memória
  108.           címzését  teszi  lehetôvé.  A  program  az  ötödik  laptábla
  109.           felhasználásával  a lineáris címtartomány 16 Mbyte feletti 4
  110.           Mbyte  méretû  részével  lehetôvé  teszi  az  SVGA  grafikus
  111.           kártyákon   elhelyezett,   maximum   4   Mbyte   méretû  RAM
  112.           virtualizálását  nem lapozott, folyamatos címterületté. Ez a
  113.           szervezés  jelentôsen megkönnyíti a nagyfelbontású képernyôt
  114.           használó   grafikus   programok  írását.  A  példaprogram  a
  115.           kompatibilitás  miatt a standard VGA kártyák által is ismert
  116.           360*480  felbontású  256  színû  üzemmódot  használja, de az
  117.           inicializáló  és  a  lapozó  rutinok  cseréjével  ez bármely
  118.           kártya  bármely üzemmódjára átültethetô. Ezzel a megoldással
  119.           akár    hardver    EMS   kártyák   memóriája   is   lineáris
  120.           címtartománnyá alakítható.
  121.  
  122.           A  lineáris  címtartomány  elsô 1 Mbyte-ja a Kernel és a DOS
  123.           memória  állandó elérhetôsége miatt a fizikai memória azonos
  124.           címtartományára mutat.
  125.  
  126.           Az  inicializálás további része tiltott interrupt állapotban
  127.           kell   fusson,  mert  bármely  interrupt  elfogadása  hibára
  128.           vezethet  félig  beállított processzorállapot esetén. Az IBM
  129.           AT  alaplapokon  lehetôség  van  az NMI interrupt hardverrel
  130.           való  maszkolására,  amit  a  program  idôlegesen igénybe is
  131.           vesz.  Elsô  feladat a még futtatható HIMEM.SYS segítségével
  132.           az   A20   címvezeték   engedélyezése  az  extended  memória
  133.           elérésére,    valamint    az    esetleges   XMS   foglaltság
  134.           ellenôrzése.  Elônyösebb  lenne,  ha  ezt  a  mûveletet  sem
  135.           kellene  más  programra bízni, de hála a különbözô alaplapok
  136.           zseniális  tervezôinek  és  gyártóinak,  az  A20  címvezeték
  137.           maszkolása szinte minden típuson más és más.
  138.  
  139.           Az  A20  címvezeték  sikeres engedélyezése után az interrupt
  140.           vezérlô  átállítása  következik.  Mint  köztudott, az IBM AT
  141.           gépek  IRQ0-7  vezetékei  az  INT 08H-0FH, IRQ8-15 vezetékei
  142.           pedig  az  IRQ2  kaszkád  vonalon  keresztül  az INT 70H-77H
  143.           megszakításokat  váltják  ki.  A  80386  processzor  azonban
  144.           kizárások   feldolgozására   tartja   fent  az  INT  00H-1FH
  145.           megszakítási   vektorokat,  ami  miatt  legalább  az  IRQ0-7
  146.           vonalak   megszakítási   vektorait   át  kell  irányítani  a
  147.           processzor   által   szabadon   hagyott   INT  vektorok  egy
  148.           csoportjára.   A  példaprogram  az  INT  20H-2FH  vektorokat
  149.           használja  a  hardver  interruptok  fogadására. A CPU védett
  150.           módra  való  felkészítése  néhány  utasítással  elvégezhetô.
  151.           Elsô  a  CR3  regiszter  beállítása,  melybe  a  lapkönyvtár
  152.           fizikai   címét  kell  betölteni  az  ábra  szerint.  Ez  az
  153.           egyetlen  fizikai  címként  értelmezett regiszter a rendszer
  154.           teljes   futásideje   alatt.  Az  LIDT  és  LGDT  utasítások
  155.           használatával  a  System  Builder  betölti  az  interrupt és
  156.           globális  leíró táblázatok leíróit a processzor IDTR és GDTR
  157.           szegmensleíró   regisztereibe.   Végül   a  CR0  0.  és  31.
  158.           bitjének  egyes  értékbe  állításával  engedélyezi  a védett
  159.           módú  címzést és a lapozóáramkör mûködését. Végül egy távoli
  160.           ugrással  törli  a processzor elôolvasási tárát, és átadja a
  161.           vezérlést az immár védett módban futó System Kernelnek.
  162.  
  163.  
  164.                               @VA System Kernel@N
  165.  
  166.           A  System  Kernel  felügyelô  program elsô feladata a gépben
  167.           fellelhetô   memória   linearizálása,   saját   taszkállapot
  168.           szegmens  (TSS=Task  State  Segment)  létrehozása, továbbá a
  169.           billentyûzet  és  timer interruptok, valamint a legfontosabb
  170.           kizárások  kezelése.  A  példaprogram létrehozza ugyan saját
  171.           taszkállapot  szegmensét,  de  nem használja. Ez az egyszerû
  172.           rendszer  még  csak  0. védelmi szinten, egy taszkban fut. A
  173.           taszkok  részletes ismertetése következô cikkem témája lesz.
  174.           Elôzetesen  leírom  a  80386  által  használt  32  bites TSS
  175.           felépítését (lásd a ""TSS felépítése" címû ábrát!).
  176.  
  177.           A  System  Kernel  feladata  még a koprocesszor védett módba
  178.           állítása  és  virtualizálása,  amit  kisebb  jelentôsége  és
  179.           helyhiány  miatt  szintén egy késôbbi cikkemben mutatok majd
  180.           be.
  181.  
  182.           A  linearizálás  a  memória  méretének  ellenôrzésébôl  és a
  183.           laptábla  helyes  kitöltésébôl  áll. A példaprogram lehetôvé
  184.           teszi  15  Mbyte virtuális memória létrehozását a szabad DOS
  185.           memória   és   a  teljes  XMS  memória  felhasználásával.  A
  186.           példaprogram   XMS   nélkül,   1  Mbyte  RAM-mal  rendelkezô
  187.           alaplapon is futtatható.
  188.  
  189.           A    példaprogram    által    használt   virtuális   memória
  190.           lapszervezésû.  E  virtuális  memória  bármely nem jelenlévô
  191.           (fizikai  memóriában  nem  elérhetô) lapjára való hivatkozás
  192.           laphibát  vált  ki. A laphiba kizárás lapcserét kezdeményez,
  193.           amely  valós  módba  való gyors visszalépések létrehozásával
  194.           --  valós  módú  DOS  hívások  felhasználásával -- behívja a
  195.           hiányzó  lapot  az  elôre  meghatározott  file-ból. Ha a lap
  196.           behívására  nincsen  szabad  lap  a  fizikai  memóriában,  a
  197.           lapozó  feladata -- a lapozási stratégiának megfelelôen -- a
  198.           legkevésbé   vagy   legrégebben   használt   lap  törlése  a
  199.           virtuális  memóriából.  A laptábla megfelelô módosítása után
  200.           a  laphibát  kezelô  rutin  a  processzor  CR3 regiszterének
  201.           újratöltésével  (azonos értékre is lehet) törli a processzor
  202.           belsô  lapfordítást  gyorsító  tárát,  a  TLB-t (Translation
  203.           Lookaside  Buffer).  A  TLB-ben  a  processzor  az utolsó 32
  204.           sikeres  lapfordítás  eredményét  tárolja a laptáblához való
  205.           sûrû  és idôpocsékoló hozzáférés elkerülésére. Ezek között a
  206.           laptábla  módosítása  miatt  már  nem  aktuális  eredmény is
  207.           lehet.   Az   így   betöltött  területek  tartalma  szabadon
  208.           megváltoztatható,  de az egyszerûség kedvéért a példaprogram
  209.           a változásokat még nem írja vissza az adott file-ba.
  210.  
  211.           A  lapozáshoz  használt  DOS  visszalépés  teljes valós módú
  212.           visszatérés,  amit a védett módú program bármikor, más célra
  213.           is  igénybe  vehet.  Ennek  során a védett módhoz kapcsolódó
  214.           teljes  rendszerállapot  mentésre kerül. A valós módban futó
  215.           rutin    memóriában    tárolt    értékeket    és   általános
  216.           regisztereket  adhat át a védett módú programnak és viszont.
  217.           A  szegmensregiszterek  értéke nem kerülhet átadásra a valós
  218.           módú  rutinnak,  így  azok  visszatérés  után  változatlanok
  219.           lesznek.   A  valós  módú  rutin  bármely  szegmensregiszter
  220.           értékét    szabadon    módosíthatja,   visszaállításuk   nem
  221.           kötelezô.
  222.  
  223.           A    timer    interrupt    (IRQ0)    kezelése    a   lapozás
  224.           optimalizálására  és  az  idôosztás taszkváltásaira egyaránt
  225.           használható.  A  timer  vezérlésére  használható elsôsorban.
  226.           Felprogramozása   a  védett  módba  való  minden  belépéskor
  227.           szükséges.
  228.  
  229.           A  billentyûzet  interrupt (IRQ1) kezelése lehetôséget ad az
  230.           aktív  taszk  váltására,  lezárására  és  a rendszerbôl való
  231.           gyors  kilépésre.  A példaprogram  csak képkirakásra ([1-[4]
  232.           gombok),  funkcióválasztásra  ([5-[8])  és  kilépésre ([Esc)
  233.           használja  a  billentyûzetet.  A billentyûzetkezelôbe be van
  234.           építve   egy  lefagyás  esetén  alkalmazható  vészkilépés  a
  235.           [SysRq] gomb használatával.
  236.  
  237.  
  238.                             @VKilépés valós módba@N
  239.  
  240.           Sokszor  szükséges,  hogy  reset  használata nélkül lehessen
  241.           visszaléptetni  a  rendszert védett módból valós módba. Erre
  242.           a  80386  processzor  lehetôséget  ad  a  CR0  regiszter  0.
  243.           bitjének  törlésével,  de visszalépés elôtt a processzort és
  244.           a  hardvert  vissza kell állítani valós módra, enélkül a DOS
  245.           mûködésképtelen.   Elsô   teendô  a  megszakítások  szokásos
  246.           tiltása.   Ezt  követi  a  szegmensregiszterek  65535  limit
  247.           értékû  és  valós módnak megfelelô bázisértékû feltöltése az
  248.           alsó  1 Mbyte lineáris címterületen. A laptábla e szegmensek
  249.           területén  a  logikai  címekkel  megegyezô  fizikai  címekre
  250.           kell,  hogy  mutasson.  Az  interrupt  vezérlô  és  a  timer
  251.           gyakoriság  visszaprogramozása  után következhet a CR0 0. és
  252.           31.  bitjének  törlése.  Egy távoli ugrással frissíteni kell
  253.           az  elôolvasási  tárat,  majd IDTR értékét 0 bázisú és 03FFH
  254.           limit  értékû  leíróval  kell  feltölteni. A GDTR-t nem kell
  255.           visszaprogramozni.  Érdemes  a  BIOS adatterületen az [Alt],
  256.           [Shift]  és    [Ctrl]    billentyûk    esetleges   lenyomott
  257.           állapotjelzésének  törlése  a  bosszúságok  elkerülésére. Az
  258.           interruptok    engedélyezése   után   a   DOS   mûködôképes,
  259.           amennyiben memóriaterületei sértetlenek.
  260.  
  261.  
  262.                   @VTanácsok védett módú programok írásához@N
  263.  
  264.           A   megszakítások   kiosztását  és  a  memóriaszervezést  --
  265.           fôképpen  a  lapozásnál  --  gondosan tervezzük meg a lehetô
  266.           legegyszerûbbre   és   leggyorsabbra.  A  laptáblákat  és  a
  267.           leírótáblákat  a  bôvíthetôség  érdekében vegyük nagyobbra a
  268.           szükségesnél.  A  használatlan  elemeket  mindig  töltsük ki
  269.           valamilyen  nyomonkövethetô  jelzéssel,  hogy ha hibát okoz,
  270.           biztosan   tudjuk,   hol  és  miért.  Védett  módú  debugger
  271.           hiányában  ez nagyon hasznos lehet. A nem használt interrupt
  272.           vektorokat  is  minden  esetben irányítsuk át egy hibakezelô
  273.           rutinra  a  könnyebb  hibakeresés  érdekében.  A  hibakezelô
  274.           térjen   vissza  valós  módba,  majd  --  szöveges  képernyô
  275.           beállítása  után  --  írja  ki  az  interrupt  sorszámát,  a
  276.           regisztereket,  esetleg a stack tetejének néhány duplaszavát
  277.           is.
  278.  
  279.           Ne  használjunk  DOS  által  relokált  távoli  ugrásokat  és
  280.           szegmenscímeket.     Mindig    hozzunk    létre    helyettük
  281.           pointereket adat- vagy kódszegmensen.
  282.  
  283.           A  DOS-szal való ütközés elkerülésére csak az alsó 640 Kbyte
  284.           szabadon  maradó  részeit  és az extended memória 1088 Kbyte
  285.           feletti   részét  használjuk  programjainkban.  Ne  hagyjunk
  286.           bent   XMS-t   használó   memóriarezidens   segédprogramokat
  287.           (például  Norton  Cache)  futtatáskor,  mivel  tárterületeik
  288.           felülírása   katasztrofális   következményekkel  járhat.  Ez
  289.           ellen  védekezhetünk  a  szabad extended memória XMM-tôl (ez
  290.           általában a HIMEM.SYS) való lekérdezésével.
  291.  
  292.           Valós  módba való rövid visszatéréseknél mindig tartsuk szem
  293.           elôtt,  hogy  az  átprogramozott  hardver  interruptok valós
  294.           módban is bekövetkezhetnek.
  295.  
  296.           Védett  módban  a  kódszegmensek  sohasem  írhatók, így írni
  297.           kívánt   változókat   mindig   adatszegmensre   tegyünk.   A
  298.           szegmensregisztereket    mindig    töltsük    fel   érvényes
  299.           szelektorral,   vagy   ha   nem   használtak,   nullával.  A
  300.           szegmensek  határait  (utolsó  használt  byte  címe)  mindig
  301.           pontosan   adjuk   meg   a   túlcímzések   felderítésére.  A
  302.           szegmensek  adatterületei  jó  ha  a  lapozáshoz illeszkedve
  303.           laphatáron  kezdôdnek  (4096-tal  osztható  lineáris címek).
  304.           Minden  kódszegmensben a leírótáblával megegyezôen adjuk meg
  305.           az  adathossz alapbeállítását a USE16 vagy USE32 kulcsszóval
  306.           a kódszegmens definíciójának végén.
  307.  
  308.           Figyeljünk   a   lapozható  memóriák  (video,  hardver  EMS)
  309.           linearizálásánál  a laphatárokon fellépô hibalehetôségre. Ha
  310.           WORD  vagy  DWORD  címzôdik  laphatáron  átlógó  résszel,  a
  311.           lapozó  hívása  végtelen  hurokba szalad. E hiba elkerülhetô
  312.           egy    lap    (4096    byte)   hozzáfûzésével.   A   módszer
  313.           idôveszteséget  és plusz lapozást igényel, így figyeljünk az
  314.           ilyen  címzések  elkerülésére.  A  beiktatott  4096  byte-os
  315.           lapot  csak akkor kell visszaírni, ha a laptáblában az adott
  316.           laphoz tartozó Dirty bit értéke 1 lett.
  317.  
  318.           Kellemes kísérletezést!
  319.  
  320.           @KFerenczi Viktor@N
  321.  
  322.  
  323. @<9410\386_3_1.GIF>A kontroll és EFLAGS regiszterek felépítése@N
  324.  
  325. @<9410\386_3_2.GIF>A TSS felépítése@N